﻿using System;
using System.Collections.Generic;
using System.Text;

namespace AlgorithmTest
{
    public class T_0007_TwoSum
    {
        // 两数之和

        // 给定一个整数数组 nums 和一个整数目标值 target，请你在该数组中找出 和为目标值 target  的那 两个 整数，并返回它们的数组下标。
        // 你可以假设每种输入只会对应一个答案。但是，数组中同一个元素在答案里不能重复出现。
        // 你可以按任意顺序返回答案。

        // 进阶：你可以想出一个时间复杂度小于 O(n2) 的算法吗？

        public void Test()
        {
            var nums = new int[] { -3, 1, 3, 4 };
            int target = 0;

            var result = TwoSum(nums, target);
            foreach (var item in result)
            {
                Console.Write(item);
            }
            Console.Read();
        }

        // hashmap记录值及索引,遍历数组在hashmap中取目标值减当前值，若存在即返回两个坐标
        // 时间：O(n)
        // 空间：O(n)
        public int[] TwoSum(int[] nums, int target)
        {
            var dic = new Dictionary<int, int>
            {
                { nums[0], 0 }
            };

            for (int i = 1; i < nums.Length; i++)
                if (dic.TryGetValue(target - nums[i], out int pointer))
                    return new int[] { pointer, i };
                else if (!dic.ContainsKey(nums[i]))
                    dic.Add(nums[i], i);
            return null;
        }
    }
}
